package com.jiyun.controller;

import com.jiyun.service.MsgService;
import com.jiyun.utils.RandomUtil;
import com.jiyun.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/JWTTest")
public class MsgController {

    // 定义Redis中存储验证码的键的前缀常量
    private static final String REDIS_VERIFY_CODE_PREFIX = "MY:";

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MsgService jwtService;

    // 生成验证码的方法
    private String generateVerificationCode() {
        return RandomUtil.getFourBitRandom();
    }

    // 发送验证码的方法
    private boolean sendVerificationCode(Map<String, String> map, String tel) {
        return jwtService.send(map, tel);
    }

    // 将验证码存储到Redis的方法
    private void storeVerificationCodeInRedis(String tel, String code) {
        redisTemplate.opsForValue().set(REDIS_VERIFY_CODE_PREFIX + tel, code, 5, TimeUnit.MINUTES);
    }

    @GetMapping("/send")
    public Result send(String tel) {

        try {
            // 从redis获取验证码，如果获取到直接返回
            String code = (String) redisTemplate.opsForValue().get(REDIS_VERIFY_CODE_PREFIX + tel);
            if (!StringUtils.isEmpty(code)) {
                return Result.ok("验证码获取成功");
            }

            // 生成随机数作为验证码
            code = generateVerificationCode();
            Map<String, String> map = new HashMap<>();
            map.put("code", code);

            // 发送验证码
            boolean b = sendVerificationCode(map, tel);
            if (b) {
                // 如果发送成功，就把验证码存到redis里，设置5分钟有效时间
                storeVerificationCodeInRedis(tel, code);
                System.out.println("succeed");
                System.out.println("验证码为" + code);
                return Result.ok("验证码发送成功");
            } else {
                System.out.println("fail");
                return Result.fail("验证码发送失败");
            }
        } catch (Exception e) {
            // 记录异常信息，这里可以根据实际情况使用日志框架进行详细记录
            e.printStackTrace();
            return Result.fail("验证码发送过程中出现异常，请稍后再试");
        }
    }
}